/** ***********************************************************************************
* @file         flash_dev.h
* @brief        FLASH底层驱动接口
* @details      主要用来进行对FLASH底层驱动接口进行读、写、擦除等操作
* @author       杨小珛
* @date         2020/03/03
* @copyright    北京高知科技有限公司    
* @version      V1.0
* @attention    无
**************************************************************************************/
#ifndef SYS_FLASH_DEV_H
#define SYS_FLASH_DEV_H

#include "os_app.h"

/*****************************FLASH命令宏定义**********************************/
#define FLASH_JEDEC_ID 0xEF4015

#define SPI_FLASH_PAGE_SIZE 256
#define SPI_FLASH_PER_WRITE_PAGE_SIZE 256

#define W25x_WRITE_ENABLE 0x06
#define W25x_WRITE_DISABLE 0x04
#define W25X_READ_EARTUS_REG 0x05
#define W25X_WRITE_EARTUS_REG 0x01
#define W25X_READ_DATA      0x03
#define W25X_FAST_READ_DATA 0x0B
#define W25X_FAST_READ_HUAL 0x3B
#define W25X_PAGE_PROGRAM   0x02
#define W25X_BLOCK_ERASE    0xD8
#define W25X_SECTOR_ERASE   0x20
#define W25X_CHIP_ERASE     0xC7
#define W25X_POWER_DONE     0xB9
#define W25X_POWER_UP       0xAB

#define W25X_JEDEC_DEVICE_ID 0x9F

/** ****************************************************************************
* @remarks       void flash_spi_dev_init(void)
* @brief         初始化SPI驱动
* @param[in]     无
* @param[out]    无
* @return        pdPASS 初始成功 pdFAIL 初始化是吧
* @attention     无
*******************************************************************************/
extern uint32_t flash_spi_dev_init(void);

/** ****************************************************************************
* @remarks       static void flash_spi_write_enable()
* @brief         FLASH 写使能
* @param[in]     无
* @param[out]    无
* @return        无
* @attention     无
*******************************************************************************/
extern void flash_spi_write_enable( void );

/** ****************************************************************************
* @remarks       void flash_spi_power_down( void )
* @brief         FLASH 低功耗模式
* @param[in]     无
* @param[out]    无
* @return        无
* @attention     无
*******************************************************************************/
extern void flash_spi_power_down( void );

/** ****************************************************************************
* @remarks       void flash_spi_power_up( void )
* @brief         FLASH 待机模式
* @param[in]     无
* @param[out]    无
* @return        无
* @attention     无
*******************************************************************************/
extern void flash_spi_power_up( void );

/** ****************************************************************************
* @remarks       void flash_spi_write_disable( void )
* @brief         FLASH 写禁止
* @param[in]     无
* @param[out]    无
* @return        FLASH 的ID
* @attention     无
*******************************************************************************/
extern void flash_spi_write_disable( void );

/** ****************************************************************************
* @remarks       void flash_spi_read_id(void)
* @brief         读取外部FLASH 的ID地址
* @param[in]     无
* @param[out]    无
* @return        FLASH 的ID
* @attention     无
*******************************************************************************/
extern uint32_t flash_spi_read_id( void );

/** ****************************************************************************
* @remarks       bool flash_spi_wait_write_fininsh(void)
* @brief         等待写操作完成
* @param[in]     无
* @param[out]    无
* @return        true 写成功 ，false 写失败
* @attention     无
*******************************************************************************/
extern bool flash_spi_wait_write_fininsh(void);

/** ****************************************************************************
* @remarks       void flash_spi_sector_erase( uint32_t sectoraddr )
* @brief         擦除4K FLASH 空间
* @param[in]     sectoraddr 参数指定空间的地址
* @param[out]    无
* @return        pdPASS 擦除成功 ， pdFAIL 擦除失败
* @attention     无
*******************************************************************************/
extern uint32_t flash_spi_sector_erase( uint32_t sectoraddr );

/** ****************************************************************************
* @remarks       uint32_t  flash_spi_block_erase( uint32_t sectoraddr, uint32_t num_erase )
* @brief         擦出数据块
* @param[in]     start_sddr 开始地址
* @param[in]     num_erase 要擦出的空间大小
* @param[out]    无
* @return        pdPASS 擦除成功 ， pdFAIL 擦除失败
* @attention     无
*******************************************************************************/
extern uint32_t  spi_flash_block_erase( uint32_t start_sddr, uint32_t num_erase );

/** ****************************************************************************
* @remarks       uint32_t flash_spi_chip_erase( uint32_t sectoraddr )
* @brief         擦除芯片空间
* @param[in]     sectoraddr 参数指定空间的地址
* @param[out]    无
* @return        pdPASS 擦除成功 ， pdFAIL 擦除失败
* @attention     无
*******************************************************************************/
extern uint32_t flash_spi_chip_erase( void );

/** ****************************************************************************
* @remarks       uint32_t flash_spi_page_write( uint32_t addr, uint8_t *pbuff, uint16_t size )
* @brief         写FLASH 页空间数据 
* @param[in]     addr 写空间地址
* @param[in]     *pbuff 写数据地址
* @param[in]     size 写数据长度
* @param[out]    无
* @return        pdPASS 写成功 ， pdFAIL 写失败
* @attention     无
*******************************************************************************/
extern uint32_t flash_spi_page_write( uint32_t addr, uint8_t *pbuff, uint16_t size );

/** ****************************************************************************
* @remarks       uint32_t flash_spi_write_data( uint32_t addr ,uint8_t *pbuff, uint16_t size )
* @brief         写FLASH 空间数据 
* @param[in]     addr 写空间地址
* @param[in]     *pbuff 写数据地址
* @param[in]     size 写数据长度
* @param[out]    无
* @return        pdPASS 写成功 ， pdFAIL 写失败
* @attention     无
*******************************************************************************/
extern uint32_t flash_spi_write_data( uint32_t addr ,uint8_t *pbuff, uint16_t size );

/** ****************************************************************************
* @remarks       uint32_t flash_spi_read_data( uint32_t addr, uint8_t *pbuff, uint16_t size )
* @brief         读取FLASH 数据
* @param[in]     ReadAddr flash地址
* @param[in]     *pbuff 读取数据地址
* @param[in]     size 读取数据的长度
* @param[out]    无
* @return        无
* @attention     无
*******************************************************************************/
extern uint32_t flash_spi_read_data( uint32_t addr, uint8_t *pbuff, uint16_t size );

/** ****************************************************************************
* @remarks       uint32_t flash_spi_dev_open(void)
* @brief         系统SPI 接口打开
* @param[in]     无
* @param[out]    无
* @return        pdPASS 打开成功       pdFAIL 打开失败
* @attention     无
*******************************************************************************/
extern uint32_t flash_spi_dev_open(void);

/** ****************************************************************************
* @remarks       uint32_t flash_spi_dev_close(void)
* @brief         系统SPI 接口关闭
* @param[in]     无
* @param[out]    无
* @return        pdPASS 关闭成功 pdFAIL 关闭失败
* @attention     无
*******************************************************************************/
extern uint32_t flash_spi_dev_close(void);

#endif

